﻿using System.ComponentModel;
using System.Data;
using System.Windows;
using System.Windows.Controls;
using TeacherLoad.Classes;

namespace TeacherLoad.Windows
{
    /// <summary>
    /// Логика взаимодействия для TeacherList.xaml
    /// </summary>
    public partial class TeacherList : Window
    {
        private bool _editMode = false;
        private int _id = 0;
        private Teacher _teacher = new Teacher();
        private List<Teacher> _teacherList = new List<Teacher>();
        private List<Teacher> _emptyTeacherList = new List<Teacher>()
        {
            new Teacher()
        };

        public TeacherList()
        {
            InitializeComponent();
            DataListTeacher.DataContext = LoadTeachers();
            listTeacher.Items.SortDescriptions.Add(new SortDescription("FullName", ListSortDirection.Ascending));
            cbListTeacher.Items.SortDescriptions.Add(new SortDescription("FullName", ListSortDirection.Ascending));
            DateDismissed.SelectedDate = DateTime.Now.Date;
            txFullName.Focus();
        }

        private List<Teacher> LoadTeachers()
        {
            DataTable dt = SendToServer.GetTeachers();
            _teacherList = new List<Teacher>();
            if (dt.Rows.Count != 0)
            {
                string date = "";
                foreach (DataRow row in dt.Rows)
                {
                    if (row[3].ToString().Length > 0)
                        date = Convert.ToDateTime(row[3]).ToString("yyyy-MM-dd");
                    Teacher item = new Teacher(
                        Convert.ToInt32(row[0]),
                        row[1].ToString(),
                        Convert.ToBoolean(row[2]),
                        date);
                    _teacherList.Add(item);
                }
                ChangeRow.IsEnabled = true;
            }
            else
            {
                _teacherList = _emptyTeacherList;
                ChangeRow.IsEnabled = false;
            }
            return _teacherList;
        }

        private void btnAddTeacher_Click(object sender, RoutedEventArgs e)
        {
            // Проверяем, что обзательные поля заполнены (ФИО преподавателя)
            if (txFullName.Text == string.Empty)
            {
                MessageBox.Show("Укажите ФИО преподавателя", "Заполните обязательные поля",
                    MessageBoxButton.OK, MessageBoxImage.Warning);
                return;
            }
            
            Teacher teach = new Teacher(_id, txFullName.Text);
            if (_editMode)
            {
                // Проверяем статус преподавателя (уволени или нет)
                bool dismissed;
                // Свойство IsChecked имеет три состояния: true, false и null (состояние неопределенности)
                if (TeacherIsDismissed.IsChecked == null || TeacherIsDismissed.IsChecked == false)
                    dismissed = false;
                else
                    dismissed = true;
                teach.Dismissed = dismissed;

                if (dismissed && DateDismissed.SelectedDate != null)
                {
                    DateTime date = Convert.ToDateTime(DateDismissed.SelectedDate);
                    teach.DateDismissed = date.ToString("yyyy-MM-dd");
                }
                else
                    teach.DateDismissed = "";
                // Изменение записи
                if (SendToServer.EditTeacher(teach))
                {
                    ClearTextBox();     // Очищаем поля ввода
                    UpdateUi();         // Обновляем интерфейс
                    _editMode = false;  // Выходим из режима редактирования
                }
                else
                {
                    MessageError();     // Ошибка операции
                    return;
                }
            }   // Если преподавателя нет в списке, то добавляем его в БД
            else if (!TeacherInList(_teacherList, txFullName.Text))
            {
                if (SendToServer.AddTeacher(teach))
                {
                    ClearTextBox();     // Очищаем поля ввода
                }
                else
                {
                    MessageError();     // Ошибка операции
                    return;
                }
            }
            else
            {
                MessageBox.Show("Указанная дисциплина уже есть в списке",
                    "Проверьте данные",
                    MessageBoxButton.OK, MessageBoxImage.Warning);
            }
            DataListTeacher.DataContext = LoadTeachers();
            txFullName.Focus();
        }

        private void txFullName_TextChanged(object sender, TextChangedEventArgs e)
        {
            if ((txFullName.Text.Length > 0) && (!_editMode))
            {
                btnClearText.Visibility = Visibility.Visible;
            }
            else
            {
                btnClearText.Visibility = Visibility.Collapsed;
            }
        }

        private void btnCancelEdit_Click(object sender, RoutedEventArgs e)
        {
            UpdateUi();
            ClearTextBox();
        }

        private void btnClearText_Click(object sender, RoutedEventArgs e)
        {
            ClearTextBox();
        }

        private void TeacherIsDismissed_Checked(object sender, RoutedEventArgs e)
        {
            labelDate.Visibility = Visibility.Visible;
            DateDismissed.Visibility = Visibility.Visible;
        }

        private void TeacherIsDismissed_Unchecked(object sender, RoutedEventArgs e)
        {
            labelDate.Visibility = Visibility.Collapsed;
            DateDismissed.Visibility = Visibility.Collapsed;
        }

        private void cbListTeacher_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            var newList = new List<Teacher>();

            var teach = cbListTeacher.SelectedItem as Teacher;
            if (teach != null)
            {
                foreach (var item in _teacherList)
                {
                    if (teach.FullName == item.FullName)
                    { newList.Add(item); }
                }
                listTeacher.DataContext = newList;
            }
            else
            {
                listTeacher.DataContext = _teacherList;
            }
        }

        private void listTeacher_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (listTeacher.SelectedItems.Count > 0)
            {
                _teacher = listTeacher.SelectedItem as Teacher;
            }
        }

        private void ChangeRow_Click(object sender, RoutedEventArgs e)
        {
            if (listTeacher.SelectedItems.Count > 0)
            {
                _editMode = true;   // Установка режима редактирования

                HeaderTeacherAdd.Header = "Обновить данные";
                btnAddTeacher.Content = "Обновить";
                btnCancelEdit.Visibility = Visibility.Visible;
                TeacherIsDismissed.Visibility = Visibility.Visible;

                txFullName.Text = _teacher.FullName;
                TeacherIsDismissed.IsChecked = _teacher.Dismissed;
                if (_teacher.Dismissed)
                {
                    DateDismissed.SelectedDate = Convert.ToDateTime(_teacher.DateDismissed);
                }

                // Получаем идентификатор (id) выделенного преподавателя
                _id = _teacher.Id;
            }
        }

        private void DoubleRow_Click(object sender, RoutedEventArgs e)
        {
            if (listTeacher.SelectedItems.Count > 0)
            {
                txFullName.Text = _teacher.FullName;
            }
        }

        // Сообщение об ошибке записи
        private void MessageError()
        {
            MessageBox.Show("Ошибка записи", "Неудача",
                        MessageBoxButton.OK, MessageBoxImage.Error);
        }

        // Очистка полей ввода (если запись была успешной)
        private void ClearTextBox()
        {
            txFullName.Clear();
            TeacherIsDismissed.IsChecked = false;
        }

        // Одновление интерфейса после успешной операции обновления данных
        private void UpdateUi()
        {
            HeaderTeacherAdd.Header = "Новый преподаватель";
            btnAddTeacher.Content = "Добавить преподавателя";
            TeacherIsDismissed.Visibility = Visibility.Collapsed;
            btnCancelEdit.Visibility = Visibility.Collapsed;
            btnClearText.Visibility = Visibility.Collapsed;
            DateDismissed.SelectedDate = DateTime.Now.Date;
            _editMode = false;
        }

        // Проверка существования преподавателя в списке
        private bool TeacherInList(List<Teacher> list, string teach)
        {
            if (list.Count == 0) { return false; }
            foreach (var it in list)
            {
                if (it.FullName == teach)
                {
                    return true;
                }
            }
            return false;
        }
    }
}
